package com.xuebusi.ribbon.loadbalance.consumer.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class BeanConfig {
    /**
     * 配置RestTemplate
     * 使用@LoadBalanced注解开启负载均衡
     * <p>
     * Ribbon内置的集中负载均衡策略：
     * (1) com.netflix.loadbalancer.RoundRobinRule: 轮询策略
     * (2) com.netflix.loadbalancer.RandomRule: 随机策略
     * (3) com.netflix.loadbalancer.RetryRule: 重试策略
     * (4) com.netflix.loadbalancer.WeightedResponseTimeRule: 权重策略.会计算每个服务的权重，权重越高，被调用的几率越大。
     * (5) com.netflix.loadbalancer.BestAvailableRule: 最佳策略。遍历所有的服务实例，过滤掉鼓掌实例，并返回请求数最小的实例。
     * (6) com.netflix.loadbalancer.AvailabilityFilteringRule: 可用过滤策略。过滤掉故障和请求数超过阈值的服务实例，再冲剩下的实例中轮询调用。
     * <p>
     * 在服务消费者的配置文件 application.properties 修改负载均衡策略:
     * <p>
     * # 使用随机策略，其中 ribbon-load-balance-provider 为需要调用的微服务名称
     * ribbon-load-balance-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
     * <p>
     * 策略选择：
     * 1. 如果每个机器配置一样，则建议不修改策略（推荐）;
     * 2. 如果部分机器配置强，则可以修改为权重策略;
     *
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
